/* 
 * BusinessException.java
 * 
 * Data de criação: 09/04/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.core.exception;

import java.util.List;

import br.com.o2solutions.core.exception.enumerator.ExceptionScope;

/**
 * Classe responsável por representar as exceções negociais dos sistemas.
 * 
 * @author osvaldeir
 * @since 09/04/2010
 * 
 */
public class BusinessException extends CoreException {

	/**
	 * <serialUID>1897465897897L</serialUID>
	 */
	private static final long serialVersionUID = 1897465897897L;

	private Object[] errorArgs;

	private List<BusinessException> validateExceptions;

	/**
	 * Retorna o(a) errorArgs. Objetos relacionados a mensagem de erro.
	 * 
	 * @return Object[] Objetos relacionados a mensagem de erro.
	 */
	public Object[] getErrorArgs() {
		return errorArgs;
	}

	/**
	 * Atribui o(a) errorArgs.
	 * 
	 * @param errorArgs
	 *            Object[] Objetos relacionados a mensagem de erro.
	 */
	public void setErrorArgs(Object[] errorArgs) {
		this.errorArgs = errorArgs;
	}

	/**
	 * Constroi o objeto {@link BusinessException} atribuindo valores aos
	 * atributos {@link BusinessException#getMessage()} ,
	 * {@link BusinessException#keyMessage} e
	 * {@link BusinessException#getCause()}
	 * 
	 * @param message
	 *            String Mensagem explicativa sobre a exceção lançada
	 * @param cause
	 *            {@link Throwable} Indicador do desvio de fluxo a ser
	 *            encapsulado.
	 */
	public BusinessException(String message, Throwable cause) {
		super(message, cause);
		this.setKeyMessage(message);
		this.setExceptionScope(ExceptionScope.BUSINESS_PROCCESS);
	}

	/**
	 * Constroi o {@link BusinessException} atribuindo valores aos atributos
	 * {@link BusinessException#getMessage()} e
	 * {@link BusinessException#keyMessage} a string parametrizada.
	 * 
	 * @param message
	 *            String Mensagem explicativa sobre a exceção lançada
	 */
	public BusinessException(String message) {
		super(message);
		this.setKeyMessage(message);
		this.setExceptionScope(ExceptionScope.BUSINESS_PROCCESS);
	}

	/**
	 * Constroi o {@link BusinessException} atribuindo valores aos atributos
	 * {@link BusinessException#getMessage()} ,
	 * {@link BusinessException#keyMessage} e
	 * {@link BusinessException#errorArgs}
	 * 
	 * @param message
	 *            String Mensagem explicativa sobre a exceção lançada
	 * @param keyMessage
	 *            Chave para internacionalização da mensagem de erro
	 * @param errorArgs
	 *            Argumentos relacionados ao erro (caso existam)
	 */
	public BusinessException(String message, String keyMessage,
			Object... errorArgs) {
		this(message);
		this.setKeyMessage(keyMessage);
		this.setErrorArgs(errorArgs);
	}

	/**
	 * Constroi o {@link BusinessException} atribuindo valores aos atributos
	 * {@link BusinessException#getMessage()} ,
	 * {@link BusinessException#keyMessage} e
	 * {@link BusinessException#errorArgs}
	 * 
	 * @param message
	 *            String Mensagem explicativa sobre a exceção lançada
	 * @param keyMessage
	 *            Chave para internacionalização da mensagem de erro
	 * @param errorArgs
	 *            Argumentos relacionados ao erro (caso existam)
	 * @param exceptionScope
	 *            Escopo da excecao.
	 */
	public BusinessException(String message, String keyMessage,
			ExceptionScope exceptionScope, Object... errorArgs) {
		this(message);
		this.setKeyMessage(keyMessage);
		this.setErrorArgs(errorArgs);
		setExceptionScope(exceptionScope);
	}

	/**
	 * Construtor para a atribuição de uma lista de exceções a Exceção
	 * principal. (Usada para as validações de atributos das entidades por
	 * exemplo).
	 * 
	 * @param validateExceptions
	 *            List<BusinessException> Lista de exceções a serem contidas
	 *            pela exceção a ser lançada.
	 */
	public BusinessException(List<BusinessException> validateExceptions) {
		super("Entidade inválida.");
		this.setExceptionScope(ExceptionScope.BUSINESS_VALIDATION);
		this.validateExceptions = validateExceptions;
	}

	/**
	 * Retorna a lista de exceções para os casos em que a validação gerou mais
	 * de um registro de invalidez.
	 * 
	 * @return List<BusinessException> Lista de exceções lançadas.
	 */
	public List<BusinessException> getValidateExceptions() {
		return this.validateExceptions;
	}
	
	@Override
	public String toString() {
		return getMessage();
	}

}
